package com.yifeng.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtil {

    /*
    负责人：

    功能：存储数据库连接 URL，从 db.properties 配置文件中加载

    参数：无

    返回值:无
    */
    private static String URL;

    /*
    负责人：

    功能：存储数据库用户名，从 db.properties 配置文件中加载

    参数：无

    返回值:无
    */
    private static String USERNAME;

    /*
    负责人：

    功能：存储数据库密码，从 db.properties 配置文件中加载

    参数：无

    返回值:无
    */
    private static String PASSWORD;

    /*
    负责人：

    功能：存储 JDBC 驱动类名，从 db.properties 配置文件中加载，默认为 MySQL 8+ 驱动

    参数：无

    返回值:无
    */
    private static String DRIVER;

    static {
        Properties props = new Properties();
        // 注意：db.properties 应放在 src/main/resources 下
        InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
        if (is == null) {
            throw new RuntimeException("找不到 db.properties 配置文件！请确保其位于 src/main/resources 目录下。");
        }
        try {
            props.load(is);
            URL = props.getProperty("db.url");
            USERNAME = props.getProperty("db.username");
            PASSWORD = props.getProperty("db.password");
            DRIVER = props.getProperty("db.driver", "com.mysql.cj.jdbc.Driver"); // 默认驱动
            // 加载驱动（JDBC 4.0+ 可省略，但显式调用更安全）
            Class.forName(DRIVER);
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException("数据库配置加载失败", e);
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
    负责人：

    功能：获取一个新的数据库连接对象（Connection），用于执行 SQL 操作

    参数：无

    返回值:成功时返回 java.sql.Connection 实例；失败时抛出 SQLException
    */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    /*
    负责人：

    功能：安全关闭 ResultSet、Statement 和 Connection 三种数据库资源，避免资源泄漏

    参数：rs - 可能为 null 的 ResultSet 对象；stmt - 可能为 null 的 Statement 对象；conn - 可能为 null 的 Connection 对象

    返回值:无
    */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
        }
        if (stmt != null) {
            try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); }
        }
        if (conn != null) {
            try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
        }
    }

    /*
    负责人：

    功能：重载的资源关闭方法，用于仅关闭 Statement 和 Connection（无 ResultSet 场景）

    参数：stmt - 可能为 null 的 Statement 对象；conn - 可能为 null 的 Connection 对象

    返回值:无
    */
    public static void close(Statement stmt, Connection conn) {
        close(null, stmt, conn);
    }

    /*
    负责人：

    功能：重载的资源关闭方法，用于仅关闭 Connection（如仅执行 getConnection 后出错需回滚的场景）

    参数：conn - 可能为 null 的 Connection 对象

    返回值:无
    */
    public static void close(Connection conn) {
        close(null, null, conn);
    }
}